home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / mxcode / gsrc211 / files.asm < prev    next >
Assembly Source File  |  1993-03-02  |  15KB  |  452 lines

  1.                 assume          ds:MyData
  2.  
  3. F_File          = 0
  4. F_Directory     = 1
  5. F_Drive         = 2
  6.  
  7. DTA_dosuse      = 0
  8. DTA_dosattr     = 15h
  9. DTA_dostime     = 16h
  10. DTA_dosdate     = 18h
  11. DTA_lsize       = 1Ah
  12. DTA_hsize       = 1Ch
  13. DTA_dosname     = 1Eh
  14. DTA_totallength = 1Fh
  15.  
  16. struc   FStruc
  17. Filename        db      13 dup (?)
  18. TypeOfFile      db      ?
  19. KInFile         dw      ?
  20. ends    FStruc
  21.  
  22. struc   Psp ; Structure representing DOS's Program Segment Prefix(Psp)
  23.     Int20h              dw  ?   ; Int 20h
  24.     EndOfAllocation dw  ?   ; Segment, end of allocation block
  25.     Reserved1           db  ?   ; Reserved by DOS
  26.     MsDosDispatcher db  5h  dup (?) ; Long call to MS-DOS function
  27.                                         ; dispatcher
  28.     OldTermination      dd  ?   ; Previous contents of termination handler
  29.                                 ; interrupt vector(Int 22h)
  30.     OldCtrlCHandler dd  ?   ; Previous contents of CTRL-C interrupt
  31.                                 ; vector(Int 23h)
  32.     OldCriticalError    dd  ?   ; Previous contents of critical-error
  33.                                 ; interrupt vector(Int 24h)
  34.     Reserved2           db  16h dup (?) ; Reserved by DOS
  35.     EnvironmentBlock    dw  ?           ; Segment address of environment block
  36.     Reserved3           db  2Eh dup (?) ; Reserved by DOS
  37.     Fcb1                db  10h dup (?) ; Default File Control Block(FCB) #1
  38.     Fcb2                db  14h dup (?) ; Default File Control Block(FCB) #2
  39.     CommanDTAil         db  ? ; Command tail and default DTA
  40. ends    ; Psp
  41.  
  42. ; The following record type represents the file attributes field in a
  43. ; DOS directory entry.
  44.  
  45. record  FileAttribType  UnUsed:2, Archive:1, Directory:1, Volume:1, System:1, Hidden:1, ReadOnly:1
  46.  
  47. struc   DTA ; Structure representing the DOS Data Transfer Area(DTA)
  48. Reserved        db  15h dup (?)     ; Used by Find Next function
  49. FileAttribute   FileAttribType  <>  ; Attribute of file that was found
  50.     ;         BIT       Meaning
  51.     ; 7 6 5 4 3 2 1 0
  52.     ;               1   Read only
  53.     ;             1     Hidden
  54.     ;           1       System
  55.     ;         1         Volume label
  56.     ;       1           Subdirectory
  57.     ;     1             Archive
  58.     ;   1               Unused
  59.     ; 1                 Unused
  60. Filetime        dw  ?               ; Time of file modification
  61. Filedate        dw  ?               ; Date of file modification
  62. Filesize        dd  ?               ; File size in bytes
  63. Filename        db  13  dup (?)     ; File name(ASCIIZ string)
  64. ends    ; DTA
  65.  
  66. proc    DisplayAll
  67.         mov     ax,MyData
  68.         mov     ds,ax
  69.         mov     cx,[TopFile]
  70.         mov     bx,1
  71.         mov     dx,48
  72.         call    DisplayFiles
  73.         ret
  74. endp    DisplayAll
  75.  
  76. SegS            dd      0
  77. Line1           dw      0
  78. ThisFile        dw      0
  79. proc            DisplayOneFile
  80.                 push    ds si es di
  81.                 mov     [Word cs:SegS+2],es
  82.                 mov     [Word cs:SegS],di
  83.                 mov     [Word cs:Line1],bx
  84.                 mov     [Word cs:ThisFile],cx
  85.                 mov     ax,MyData
  86.                 mov     ds,ax
  87.                 mov     ax,[cs:Screen]
  88.                 mov     es,ax
  89.                 mov     ax,160
  90.                 mul     bx
  91.                 mov     di,ax
  92.                 add     di,56*2
  93. ;                inc     di
  94. ;                inc     di
  95.                 push    cx
  96.                 mov     cx,22
  97. @@WriteBackLoop:mov     ax,[es:di]
  98.                 and     ah,00001111b
  99.                 stosw
  100.                 loop    @@WriteBackLoop
  101.                 pop     cx
  102.  
  103.                 lds     si,[cs:SegS]
  104.                 mov     ax,size FStruc
  105.                 mul     cx
  106.                 add     si,ax
  107.                 cmp     [Byte si+FStruc.TypeOfFile],F_Directory
  108.                 jz      @@JustWriteTheDirectory
  109.                 mov     ax,seg MKLine
  110.                 mov     es,ax
  111.                 mov     di,offset MKLine
  112.                 mov     cx,8
  113.                 push    ds si
  114. @@CopyNameLoop: lodsb
  115.                 cmp     al,0
  116.                 jz      @@FoundPeriod
  117.                 cmp     al,'.'
  118.                 jz      @@FoundPeriod
  119.                 stosb
  120.                 loop    @@CopyNameLoop
  121.                 inc     si
  122. @@FoundPeriod:  mov     al,0
  123.                 stosb
  124.                 mov     cx,3
  125.                 mov     di,offset Ext
  126.                 cmp     [Byte si],0
  127.                 jz      @@ZeroAtExt
  128. @@CopyExtLoop:  lodsb
  129.                 cmp     al,0
  130.                 jz      @@ZeroAtExt
  131.                 stosb
  132.                 loop    @@CopyExtLoop
  133. @@ZeroAtExt:    mov     al,0
  134.                 stosb
  135.                 mov     dx,[cs:Line1]
  136.                 mov     bx,56
  137.                 mov     cx,seg MKLine
  138.                 mov     si,offset MKLine
  139.                 mov     ax,8
  140.                 mov     di,200Ah
  141.                 call    WriteChars
  142.                 mov     dx,[cs:Line1]
  143.                 mov     bx,65
  144.                 mov     cx,seg Ext
  145.                 mov     si,offset Ext
  146.                 mov     ax,3
  147.                 mov     di,200Ah
  148.                 call    WriteChars
  149.                 pop     si ds
  150.                 mov     bx,[Word si+FStruc.KInFile]
  151.                 mov     ax,bx
  152.                 mov     dx,3
  153.                 mov     cx,seg kline2
  154.                 mov     di,offset kline2+1
  155.                 call    ConvertKToStr
  156.                 mov     bx,74
  157.                 mov     dx,[cs:Line1]
  158.                 mov     cx,seg kline2
  159.                 mov     si,offset kline2
  160.                 call    Write
  161.                 jmp     @@AlmostDone
  162. @@JustWriteTheDirectory:
  163.                 mov     dx,[cs:Line1]
  164.                 mov     bx,56
  165.                 mov     cx,ds
  166.                 mov     ax,8
  167.                 mov     di,2004h
  168.                 call    WriteChars
  169.                 mov     bx,65
  170.                 mov     dx,[cs:Line1]
  171.                 mov     cx,seg ExtBlank
  172.                 mov     si,offset ExtBlank
  173.                 call    Write
  174.                 mov     bx,74
  175.                 mov     dx,[cs:Line1]
  176.                 mov     cx,seg ExtBlank
  177.                 mov     si,offset ExtBlank
  178.                 call    Write
  179. @@AlmostDone:   mov     ax,MyData
  180.                 mov     ds,ax
  181.                 mov     ax,[ThisFile]
  182.                 cmp     ax,[CurFile]
  183.                 jnz     @@End
  184.  
  185.                 mov     ax,[Screen]
  186.                 mov     es,ax
  187.                 mov     ax,160
  188.                 mul     [cs:Line1]
  189.                 mov     di,ax
  190. ;                add     di,2
  191.                 add     di,56*2
  192.                 mov     cx,22
  193. @@WriteLoop:    mov     ax,[es:di]
  194.                 or      ah,01010000b
  195.                 stosw
  196.                 loop    @@WriteLoop
  197. @@End:          pop     di es si ds
  198.                 ret
  199. endp            DisplayOneFile
  200.  
  201. ; cx - Start
  202. ; bx - Startline
  203. ; dx - NumLines
  204. proc            DisplayFiles
  205.                 push    ds si es di
  206.                 les     di,[FileSeg]
  207.                 add     dx,bx
  208. @@DisplayFileLoop:
  209.                 cmp     cx,[NumFiles]
  210.                 jge     @@ClearRest
  211.                 push    bx cx dx
  212.                 call    DisplayOneFile
  213.                 pop     dx cx bx
  214. @@DoIt:         inc     cx
  215.                 inc     bx
  216.                 cmp     bx,dx
  217.                 jnz     @@DisplayFileLoop
  218.                 jmp     @@Done
  219. @@ClearRest:    push    bx cx dx
  220.                 mov     ax,[cs:Screen]
  221.                 mov     es,ax
  222.                 mov     ax,160
  223.                 mul     bx
  224.                 mov     di,ax
  225.                 add     di,56*2
  226. ;                inc     di
  227. ;                inc     di
  228.                 mov     cx,22
  229. @@WriteBackLoop:mov     [Word es:di],0
  230.                 add     di,2
  231.                 loop    @@WriteBackLoop
  232.                 pop     dx cx bx
  233.                 jmp     @@DoIt
  234. @@Done:         pop     di es si ds
  235.                 ret
  236. endp            DisplayFiles
  237.  
  238. ; ax - Type Of File
  239. proc            CopyFilename
  240.                 push    ds si es di
  241.                 mov     dx,seg NewDTA
  242.                 mov     ds,dx
  243.                 mov     si,offset NewDTA
  244.                 mov     [Byte es:di+FStruc.TypeOfFile],al
  245.                 add     si,(offset (DTA).Filename)
  246.                 mov     cx,13
  247.                 rep     movsb
  248.                 pop     di es si ds
  249.                 ret
  250. endp            CopyFilename
  251.  
  252. proc            CleanFileSegment
  253.                 les     di,[FileSeg]
  254.                 xor     dx,dx
  255.                 mov     ax,size FStruc
  256.                 mov     bx,[MaxFiles]
  257.                 mul     bx
  258.                 mov     cx,ax
  259.                 shr     cx,1
  260.                 xor     ax,ax
  261.                 rep     stosw
  262.                 xor     di,di
  263.                 ret
  264. endp            CleanFileSegment
  265.  
  266. proc            GetDrives
  267.                 push    es di
  268.                 mov     ax,seg DriveList
  269.                 mov     es,ax
  270.                 mov     di,offset DriveList
  271.                 mov     bx,1
  272. @@LoopDrives:   mov     [Byte es:di],0
  273.                 mov     ax,4409h
  274.                 int     21h
  275.                 jb      @@BottomLoop
  276.                 mov     [Byte es:di],1
  277. @@BottomLoop:   inc     di
  278.                 inc     bx
  279.                 cmp     bx,26
  280.                 jnz     @@LoopDrives
  281.                 pop     di es
  282.                 ret
  283. endp            GetDrives
  284.  
  285. proc            GetDirs
  286.                 push    ds si
  287.                 mov     ax,seg WildDir
  288.                 mov     ds,ax
  289.                 mov     dx,offset WildDir
  290. @@DirSearch:    mov     ah,4Eh
  291.                 mov     cx,3Fh
  292.                 int     21h
  293.                 jb      @@End
  294. @@Internal:     mov     al,[Byte offset NewDTA+(offset (DTA).FileAttribute)]
  295.                 test    al,10h          ; Is the file a directory
  296.                 jz      @@SkipIt        ; Nope
  297.                 mov     ax,F_Directory
  298.                 call    CopyFilename
  299.                 inc     [Word NumFiles]
  300.                 mov     ax,[NumFiles]
  301.                 cmp     [MaxFiles],ax
  302.                 jz      @@End
  303.                 add     di,size FStruc
  304. @@SkipIt:       mov     ah,4Fh
  305.                 int     21h
  306.                 jnb     @@Internal
  307. @@End:          pop     si ds
  308.                 ret
  309. endp            GetDirs
  310.  
  311. proc            GetInfoOnMOD
  312.                 push    ds si es di
  313.                 mov     ax,seg NewDTA
  314.                 mov     ds,ax
  315.                 mov     si,offset NewDTA
  316.                 mov     ax,F_File
  317.                 call    CopyFilename
  318.  
  319.                 mov     ax,[Word offset NewDTA+(offset (DTA).Filesize)+1]
  320.                 shr     ax,2
  321.                 mov     [Word es:di+(offset(FStruc).KInFile)],ax
  322.                 pop     di es si ds
  323.                 ret
  324. endp            GetInfoOnMOD
  325.  
  326. proc            GetModules
  327.                 push    ds si
  328.                 mov     ax,[MaxFiles]
  329.                 cmp     [NumFiles],ax
  330.                 jz      @@End
  331.                 mov     ax,seg WildMod
  332.                 mov     ds,ax
  333.                 mov     dx,offset WildMod
  334. @@DirSearch:    mov     ah,4Eh
  335.                 mov     cx,3h
  336.                 int     21h
  337.                 jb      @@End
  338. @@Internal:     call    GetInfoOnMOD
  339.                 inc     [Word NumFiles]
  340.                 mov     ax,[NumFiles]
  341.                 cmp     [MaxFiles],ax
  342.                 jz      @@End
  343.                 add     di,size FStruc
  344.                 mov     ah,4Fh
  345.                 int     21h
  346.                 jnb     @@Internal
  347. @@End:          pop     si ds
  348.                 ret
  349. endp            GetModules
  350.  
  351. proc            ReadFiles
  352.                 push    es di
  353.                 mov     ax,MyData
  354.                 mov     ds,ax
  355.                 mov     [Word NumFiles],0
  356.                 mov     [Word CurFile],0
  357.                 mov     [Word TopFile],0
  358.                 mov     ah,1Ah
  359.                 mov     dx,offset NewDTA
  360.                 int     21h
  361.                 push    ds
  362.                 mov     ax,seg CurPath
  363.                 mov     ds,ax
  364.                 mov     si,offset CurPath
  365.                 mov     ah,47h
  366.                 mov     dl,0
  367.                 int     21h
  368.                 pop     ds
  369.                 mov     ah,19h
  370.                 int     21h
  371.                 add     al,'A'
  372.                 mov     [DriveLetter],al
  373.  
  374.                 call    CleanFileSegment
  375.                 call    GetDrives
  376.                 call    GetDirs
  377.                 call    GetModules
  378.                 mov     ax,[MaxFiles]
  379.                 cmp     [NumFiles],ax
  380.                 jnz     @@End
  381. ;        call    TooManyFiles
  382. @@End:          call    SortFiles
  383.                 pop     di es
  384.                 ret
  385. endp            ReadFiles
  386.  
  387. proc            SortFiles
  388.                 push    ds si es di bp
  389.                 les     di,[FileSeg]
  390.                 mov     si,di
  391.                 add     di,size FStruc
  392.                 mov     cx,[NumFiles]
  393.                 or      cx,cx
  394.                 jz      @@End
  395.                 mov     cx,0
  396.                 mov     dx,size FStruc
  397.                 mov     bx,0
  398. @@TopLoop:      push    cx bp
  399.                 mov     bp,0
  400.                 ; ──── Compare
  401.                 mov     al,[es:bp+si+FStruc.TypeOfFile]
  402.                 cmp     al,[es:bp+di+FStruc.TypeOfFile]
  403.                 jnz     @@NewRecord
  404.  
  405.                 mov     cx,8
  406. @@ByteByByte:   mov     al,[es:bp+si]
  407.                 mov     ah,[es:bp+di]
  408.                 inc     bp
  409.                 cmp     al,ah
  410.                 jnz     @@DoneCompare
  411.                 cmp     al,0
  412.                 jnz     @@CheckOther
  413.                 clc
  414.                 jmp     @@DoneCompare
  415. @@CheckOther:   cmp     ah,0
  416.                 jnz     @@ByteByByte
  417.                 stc
  418. @@DoneCompare:  jb      @@NewRecord
  419.  
  420. @@SwapThem:     mov     bx,1
  421.                 mov     bp,0
  422.                 mov     cx,dx
  423. @@SwapLoop:     mov     al,[es:bp+si]
  424.                 mov     ah,[es:bp+di]
  425.                 mov     [es:bp+di],al
  426.                 mov     [es:bp+si],ah
  427.                 inc     bp
  428.                 loop    @@SwapLoop
  429.  
  430. @@NewRecord:    pop     bp cx
  431.                 inc     cx
  432.                 mov     ax,[NumFiles]
  433.                 dec     ax
  434.                 cmp     cx,ax
  435.                 jz      @@FixThem
  436.                 add     si,dx
  437.                 add     di,dx
  438.                 jmp     @@TopLoop
  439. @@FixThem:      cmp     bx,0
  440.                 jz      @@End
  441.                 les     di,[FileSeg]
  442.                 mov     si,di
  443.                 add     di,dx
  444.                 mov     bx,0
  445.                 mov     cx,0
  446.                 jmp     @@TopLoop
  447. @@End:          pop     bp di es si ds
  448.                 ret
  449. endp    SortFiles
  450.  
  451.  
  452.